package com.broada.apm.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import com.broada.apm.ajax.ConfigResult;
import com.broada.apm.entity.ConfigVariable;
import com.broada.apm.entity.IPLocation;
import com.broada.apm.entity.UserInfo;
import com.broada.apm.model.Dimension.Error;
import com.broada.apm.model.L7Module;
import com.broada.apm.model.User;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;

/**
 * 
 * 系统配置操作service接口类
 * 
 * @author xiangsy Create By 2015年2月6日 上午10:16:18
 */
@Path("apm/configs")
@Api(value="apm/configs" , description = "系统配置操作APIs")
public interface ConfigService {
	/**
	 * 系统配置添加
	 * 
	 * @param map对象字符串
	 * @return
	 */
	@POST
	@Path("/systemConfig")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "系统配置添加")
	public ConfigResult addBasicCon(@ApiParam(value = "需要添加的系统配置", required = true) ConfigVariable variable);

	/**
	 * 系统配置查询
	 * 
	 * @param configItem
	 *          key关键字前缀
	 * @return
	 */
	@GET
	@Path("/systemConfig")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "系统配置查询")
	public ConfigResult queryBasicCon(@ApiParam(value = "需要查询的系统配置项", required = true) @QueryParam("configItem") String configItem);

	/**
	 * 获取服务器当前时间
	 * 
	 * @param
	 * @return
	 */
	@GET
	@Path("/systemTime")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "获取服务器当前时间")
	public ConfigResult getSysTime();
	/**
	 * 根据地理位置Id查询下级地区列表
	 * 
	 * @param areaCode 地理位置编码
	 * 
	 * @return
	 */
	@GET
	@Path("/position/area")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "根据地理位置Id查询下级地区列表")
	public ConfigResult queryAreaList(@ApiParam(value = "地理位置编码", required = true) @QueryParam("areaCode") String areaCode);

	/**
	 * IP地理位置库维护内置库立即更新
	 * 
	 * @param
	 * @return
	 */
	@PUT
	@Path("/iprepair/innerlib")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "IP地理位置库维护内置库立即更新")
	public ConfigResult updateLib();

	/**
	 * IP地理位置库维护添加
	 * 
	 * @param
	 * @return
	 */
	@POST
	@Path("/iprepair")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "IP地理位置库维护添加")
	public ConfigResult addIpRepair(@ApiParam(value = "需要添加的ip地理位置库", required = true) IPLocation IPobj);

	/**
	 * IP地理位置库维护修改
	 * 
	 * @param 修改输入的对象数据
	 * @return
	 */
	@PUT
	@Path("/iprepair")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "IP地理位置库维护修改")
	public ConfigResult updIpRepair(@ApiParam(value = "需要修改的ip地理位置库", required = true) IPLocation obj);

	/**
	 * IP地理位置库维护列表查询
	 * 
	 * @param
	 * @return
	 */
	@GET
	@Path("/iprepair")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "IP地理位置库维护列表查询")
	public ConfigResult queryIpRepair(
			@ApiParam(value = "需要查询的开始ip", required = false) @QueryParam("startIp") String ip, 
			@ApiParam(value = "地理位置编码", required = false) @QueryParam("areaCode") String areaCode,
			@ApiParam(value = "备注", required = false) @QueryParam("memo") String memo, 
			@ApiParam(value = "页码", required = true) @QueryParam("pageIndex") String pageIndex, 
			@ApiParam(value = "每页显示的查询记录条数", required = true) @QueryParam("pageSize") String pageSize);

	/**
	 * IP地理位置库维护删除
	 * 
	 * @param IpareaIndex要删除的列id
	 * @return
	 */
	@DELETE
	@Path("/iprepair")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "IP地理位置库维护删除")
	public ConfigResult delIpRepair(@ApiParam(value = "需要删除的ip地理位置id", required = false) @QueryParam("IpareaIndex") String IpareaIndex);

	/**
	 * IP地理位置库文件上传
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@POST
	@Path("/iprepair/ipFileupload")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes({ MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_JSON })
	@ApiOperation(value = "IP地理位置库文件上传")
	public ConfigResult ipFileUpload(@Context HttpServletRequest request, @Context HttpServletResponse response) throws Exception;

	/**
	 * IP地理位置库内置库文件上传
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@POST
	@Path("/iprepair/innerLibupload")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes({ MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_JSON })
	@ApiOperation(value = "IP地理位置库内置库文件上传")
	public ConfigResult innerLibUpload(@Context HttpServletRequest request, @Context HttpServletResponse response);

	/**
	 * 用户管理用户列表查询
	 * 
	 * @param
	 * @return
	 */
	@GET
	@Path("/usermanage")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "用户管理用户列表查询")
	public ConfigResult queryUser(
			@ApiParam(value = "页码", required = true) @QueryParam("pageIndex") int pageIndex,
			@ApiParam(value = "每页显示的查询记录条数", required = true) @QueryParam("pageSize") int pageSize);

	/**
	 * 用户管理用户添加
	 * 
	 * @param 添加的对象数据
	 * @return
	 */
	@POST
	@Path("/usermanage")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "用户管理用户添加")
	public ConfigResult addUser(@ApiParam(value = "需要添加的用户的基本信息，提交形式类似于：{account: \"asd\", name: \"asd\", password: \"asd\", role: 2, status: 0}", required = true) String json);

	/**
	 * 用户管理用户修改
	 * 
	 * @param x修改的对象数据
	 * @return
	 */
	@PUT
	@Path("/usermanage")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "用户管理用户修改")
	public ConfigResult updateUser(@ApiParam(value = "需要修改的用户的基本信息，提交形式类似于：{account: \"asd\", name: \"asd\", password: \"asd\", role: 2, status: 0}", required = true) String json);

	/**
	 * 用户管理用户删除
	 * 
	 * @param userId
	 *          要删除的用户id
	 * @return
	 */
	@DELETE
	@Path("/usermanage/{userId}")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "用户管理用户删除")
	public ConfigResult delUser(@ApiParam(value = "需要删除的用户id", required = true) @PathParam("userId") String userId);

	/**
	 * 系统用户密码修改
	 * 
	 * @param userId
	 *          要修改密码的用户id
	 * @param pwd
	 *          要修改的密码
	 * @return
	 */
	@PUT
	@Path("/usermanage/pwd")
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "系统用户密码修改")
	public ConfigResult updatePwd(@ApiParam(value = "需要更改用户密码的用户的token信息", required = true) @QueryParam("token") String token, 
			@ApiParam(value = "提交的用户信息", required = true) UserInfo user);

	/**
	 * 用户启用与禁用
	 * 
	 * @param userId
	 *          要修改密码的用户id
	 * @param status
	 *          要修改的状态
	 * @return
	 */
	@PUT
	@Path("/usermanage/status")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "用户启用与禁用")
	public ConfigResult updateStatus(@ApiParam(value = "用户信息，提交形式类似于：{id: \"39df6a9e-8013-4046-aca3-37a3c1fb89a5\", status: 1}", required = true) User user);
	
	/**
	 * L7模块列表查询
	 * 
	 * @param
	 * @return
	 */
	@GET
	@Path("/modulel7")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块列表查询")
	public ConfigResult queryL7Module();

	/**
	 * L7模块删除
	 * 
	 * @param moduleId
	 *          模块id
	 * @return
	 */
	@DELETE
	@Path("/modulel7")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块删除")
	public ConfigResult deleteL7Module(@ApiParam(value = "模块id", required = true) @QueryParam("moduleId") String moduleId);

	/**
	 * L7模块启用与禁用
	 * 
	 * @param moduleId
	 *          模块id
	 * @param status
	 *          要修改的状态
	 * @return
	 */
	@PUT
	@Path("/modulel7/status")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块启用与禁用")
	public ConfigResult updStatusL7Module(@ApiParam(value = "模块信息，提交形式类似于：{id: \"80\", status: 0}，0为启用，1为禁用", required = true) L7Module module);

	/**
	 * L7模块返回码设置修改
	 * 
	 * @param moduleId
	 *          模块id
	 * @param status
	 *          要修改的状态
	 * @return
	 */
	@PUT
	@Path("/modulel7/updRecode")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块返回码设置修改")
	public ConfigResult setL7ModuleCode(@ApiParam(value = "提交的返回码信息", required = true) Error error);

	/**
	 * L7模块返回码添加
	 * 
	 * @param codeJson
	 *          返回码信息字符串
	 * @return
	 */
	@POST
	@Path("/modulel7/addRecode")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块返回码添加")
	public ConfigResult addL7ModuleCode(@ApiParam(value = "提交的返回码信息", required = true) Error error);

	/**
	 * L7模块返回码查询
	 * 
	 * @param moduleId
	 *          模块id
	 * @return
	 */
	@GET
	@Path("/modulel7/recodes")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块返回码查询")
	public ConfigResult queryL7ModuleCode(@ApiParam(value = "要查询的模块号", required = true) @QueryParam("l7_proto") String l7_proto);

	/**
	 * L7模块返回码添加删除
	 * 
	 * @param moduleId
	 *          模块id
	 * @param codeId
	 *          返回码id
	 * @return
	 */
	@DELETE
	@Path("/modulel7/delRecode")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "L7模块返回码添加删除，根据返回码id进行删除")
	public ConfigResult delL7ModuleCode(
			@ApiParam(value = "模块号", required = true) @QueryParam("protocol") int protocol, 
			@ApiParam(value = "返回码id", required = true) @QueryParam("id") String id,
			@ApiParam(value = "返回码", required = true) @QueryParam("code") String code, 
			@ApiParam(value = "返回码信息", required = true) @QueryParam("errorMessage") String errorMessage);

	/**
	 * 历史数据磁盘容量和使用量查询
	 * 
	 * @param
	 * @return
	 */
	@GET
	@Path("/history")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "历史数据磁盘容量和使用量查询")
	public ConfigResult historyDiskData();
	/**
	 * 历史数据清理
	 * 
	 * @param
	 * @return
	 */
	@DELETE
	@Path("/history")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "历史数据清理")
	public ConfigResult historyCleanData(
			@ApiParam(value = "清除几个月之前的数据", required = true) @QueryParam("cleanTime") int cleanTime,
			@ApiParam(value = "要清除历史数据的应用系统的id", required = true) @QueryParam("appIds") String appIds);

	/**
	 * L7模块文件上传
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@POST
	@Path("/upload")
	@Consumes({ MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_JSON })
	@Produces(MediaType.TEXT_PLAIN)
	@ApiOperation(value = "L7模块文件上传")
	public ConfigResult uploadL7Module(@Context HttpServletRequest request, @Context HttpServletResponse response)
			throws Exception;

	/**
	 * L7模块导出
	 * 
	 * @param moduleId
	 *          模块Id
	 * @return
	 */
	@GET
	@Path("/downloadL7Module")
	@Produces(MediaType.TEXT_PLAIN)
	@ApiOperation(value = "L7模块导出")
	public ConfigResult downloadL7Module(@Context HttpServletRequest request, @Context HttpServletResponse response,
			@ApiParam(value = "模块名称", required = true) @QueryParam("moduleName") String moduleName, 
			@ApiParam(value = "模块号", required = true) @QueryParam("l7_proto") int l7_proto) throws Exception;

	/**
	 * 基本设置logo文件上传
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	@POST
	@Path("/logo")
	@Consumes({ MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_JSON })
	@Produces(MediaType.TEXT_PLAIN)
	@ApiOperation(value = "基本设置logo文件上传")
	public ConfigResult LogoUpload(@Context HttpServletRequest request, @Context HttpServletResponse response) throws Exception;
	/**
	 * 获取系统默认apdex
	 * 
	 * @return
	 */
	@GET
	@Path("/baseApdex")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "获取系统默认apdex")
	public ConfigResult queryBaseApdex();
	
	/**
	 * 阀值类型列表
	 * @return
	 */
	@GET
	@Path("/alertThreshold")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "阀值类型列表")
	public ConfigResult queryAlertThresholdType();

	/**
	 * 获取当前用户
	 * 
	 * @return
	 */
	@GET
	@Path("/loginUser")
	@Produces(MediaType.APPLICATION_JSON)
	@ApiOperation(value = "获取当前用户")
	public ConfigResult currentUser(@ApiParam(value = "当前用户的token信息", required = true) @QueryParam("token") String token);
	
	/**
	 * ip地理位置库模板导出
	 * @return
	 */
	@GET
	@Path("/downloadIPMod")
	@Produces(MediaType.TEXT_PLAIN)
	@ApiOperation(value = "ip地理位置库模板导出")
	public ConfigResult downloadIPLibMod(@Context HttpServletRequest request, @Context HttpServletResponse response) throws Exception;
}
